﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Uurrooster_opdracht
{
    public partial class FormLesMoment : Form
    {

        //================================VARIABELEN==============================================
        DataClasses1DataContext DB;
        List<tblLesmoment> LIJSTLESMOMENTEN;
        




        //================================INITIALISATIE===========================================

        public FormLesMoment()
        {
            InitializeComponent();
            DB = new DataClasses1DataContext();
            LIJSTLESMOMENTEN = DB.tblLesmoments.ToList();
        }


        private void FormLesMoment_Load(object sender, EventArgs e)
        {
            enableAllButtons();
            updateTotal();
            butFirst_Click(null, null);
        }





        //==================================HANDLERS VOOR ACTION BUTTONS===============================


        private void butFirst_Click(object sender, EventArgs e)
        {
            long EERSTE_ID = LIJSTLESMOMENTEN.First().lesmomentID;

            this.dipslayLesmoment(EERSTE_ID);

            //de knoppen mogen terug aan, als ze afstonden!
            enableAllButtons();


        }

        private void butNext_Click(object sender, EventArgs e)
        {
            //algemene voorbereiding
            LIJSTLESMOMENTEN = DB.tblLesmoments.ToList();

            //inlezen van de studentenID die momenteel in het tekstvenster staat
            String huidigeID = txtLesmomentID.Text;

            //omzetten naar een long
            long huidigeLesmomentID = Convert.ToInt64(huidigeID);

            //startwaarde om positie van huidige student in lijst te zoeken
            int index = -1;

            //index laten oplopen zolang de juiste student niet gevonden is
            //totdat einde lijst bereikt is
            do
            {
                index++; //opmerking : feitelijk starten we bij item nr 0
            }
            while ((LIJSTLESMOMENTEN[index].lesmomentID != huidigeLesmomentID) &&
                   (index < LIJSTLESMOMENTEN.Count()));

            //nu wordt overgeschakeld van de huidige student op de volgende student
            index++;

            //de loop wordt verlaten indien alle elementen uit de lijst zijn doorlopen
            //in dat geval = index gelijk aan Count()
            //in dat geval -> doe niets
            if (index == LIJSTLESMOMENTEN.Count())
            {
                disableAllButtons();
                butFirst.Enabled = true;
                txtWeekdag.Text = "GEEN NEXT!";
                txtStartuur.Text = "GEEN NEXT!";
                txtEinduur.Text = "GEEN NEXT!";
                txtLesmomentID.Text = "GEEN NEXT!";
                return;
            }

            //de loop wordt ook verlaten in dat geval is de index gelijk aan de huidig af te beelden 
            //student
            if (index < LIJSTLESMOMENTEN.Count())
            {
                this.dipslayLesmoment(LIJSTLESMOMENTEN[index].lesmomentID);
            }




        }

        private void butAdd_Click(object sender, EventArgs e)
        {
            //de informatie in de tekstvelden moet kunnen omgezet worden naar een string
            //van lengte 20
            tblLesmoment NIEUW = new tblLesmoment();
            NIEUW.lesmomentWeekdag = txtWeekdag.Text;
            NIEUW.lesmomentStartUur = getDateTime(txtStartuur.Text);
            NIEUW.lesmomentEindUur = getDateTime(txtEinduur.Text);

            //submitten van de creatie van de nieuwe student
            DB.tblLesmoments.InsertOnSubmit(NIEUW);
            DB.SubmitChanges();

            //updaten van de scherminfo
            this.dipslayLesmoment(NIEUW.lesmomentID);
        
        }

        private void butEdit_Click(object sender, EventArgs e)
        {
            //inlezen van de studentenID die momenteel in het tekstveld staat
            String huidigeID = txtLesmomentID.Text;

            //omzetten naar een long
            long huidigeLesmomentID = Convert.ToInt64(huidigeID);

            //opzoeken van student met dit StudentenID
            tblLesmoment gekozen = (from tblLesmoment
                                  in DB.tblLesmoments
                                  where tblLesmoment.lesmomentID == huidigeLesmomentID
                                  select tblLesmoment).First();

            //de tekstvelden moet gereduceerd worden tot lengte 20 characters!
            //de info uit de tekstvelden naar een lengte brengen die zeker 20 characters is
            //en dit om mogelijke format-Out_of_Bounds Exceptions te voorkomen in de database!

            //de info uit de tekstvelden opslaan
            gekozen.lesmomentWeekdag = txtWeekdag.Text.PadRight(16);
            gekozen.lesmomentWeekdag = gekozen.lesmomentWeekdag.Substring(0, 16);

            gekozen.lesmomentStartUur = getDateTime(txtStartuur.Text);

            gekozen.lesmomentEindUur = getDateTime(txtEinduur.Text);

            //de aangepaste gegevens nu nog opslaan in de database
            DB.SubmitChanges();

            //updaten van scherminfo
            dipslayLesmoment(gekozen.lesmomentID);


        }



        private void butDelete_Click(object sender, EventArgs e)
        {

            //inlezen van de studentenID die momenteel in het tekstvenster staat
            String huidigeID = txtLesmomentID.Text;

            //omzetten naar een long
            long huidigeLesmomentID = Convert.ToInt64(huidigeID);

            //de te deleten student selecteren uit de database
            tblLesmoment magweg = (from tblLesmoment
                                 in DB.tblLesmoments
                                 where tblLesmoment.lesmomentID == huidigeLesmomentID
                                 select tblLesmoment).First();

            //doorvoeren wijzigingen
            DB.tblLesmoments.DeleteOnSubmit(magweg);
            DB.SubmitChanges();


            //updaten van het schermgebeuren
            butFirst_Click(null, null);

        }



        private void butClear_Click(object sender, EventArgs e)
        {
            txtWeekdag.Text = "";
            txtStartuur.Text = "";
            txtEinduur.Text = "";
            txtLesmomentID.Text = "***";

            //knop add mag nu actief zijn !
            disableAllButtons();
            butAdd.Enabled = true;

        }



        //====================================HULP METHODEN================================

        //zet alle knoppen actief
        private void enableAllButtons()
        {
            butFirst.Enabled = true;
            butNext.Enabled = true;
            butAdd.Enabled = false;  //uitzondering! kan alleen indien men eerst op new drukt
            butDelete.Enabled = true;
            butEdit.Enabled = true;
            butClear.Enabled = true;
        }



        //zet allen knoppen af
        private void disableAllButtons()
        {
            butFirst.Enabled = true;  //uitzondering: mag altijd aanblijven staan...
            butNext.Enabled = false;
            butAdd.Enabled = false;
            butDelete.Enabled = false;
            butEdit.Enabled = false;
            butClear.Enabled = false;
        }




        //zorg dat het totaal van de student wordt geupdate
        private void updateTotal()
        {
            //update van de lijsten
            LIJSTLESMOMENTEN = DB.tblLesmoments.ToList();
            //update van het totaal
            lblTotaal.Text = "" + LIJSTLESMOMENTEN.Count();
        }



        private void dipslayLesmoment(long X)
        {
            //voor alle veiligheid ook het totaal updaten
            updateTotal();

            //opzoeken van student met dit StudentenID
            tblLesmoment gekozen = (from tblLesmoment
                                  in DB.tblLesmoments
                                  where tblLesmoment.lesmomentID == X
                                  select tblLesmoment).First();

            //gegevens in de tekstvelden zetten
            txtWeekdag.Text = gekozen.lesmomentWeekdag;
            txtStartuur.Text = gekozen.lesmomentStartUur + "";
            txtEinduur.Text = gekozen.lesmomentEindUur + "";
            txtLesmomentID.Text = gekozen.lesmomentID + "";
        }




        private DateTime getDateTime(String X)
        {
            //moet een meegeven string omzetten naar een DateTime-object
            DateTime myDateTime = DateTime.Parse(X);
            return myDateTime;
        }

    }
}
